import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 *clase jugador 
 *
 * 
 * @author Anthony Robledo 
 * @version 1.1
 */
public class jugador extends Actor
{
    private int t=0;//variable para cambiar el fondo del escenario
    private boolean dir;//para saver la direccion del jugador true= derecha false= izq
    
    private boolean estaCongelado;// saver si el jugador esta congelado por un cubo
    private int contHielo;//contador para que el jugadro sea descongelado si llega a presionar las teclas el numero de veces indicado
    
    private boolean salto;//indica si el jugador salto
    private int yIni;// para saver cual es la y inicial del jugador antes de brincar
   
    private int alto;//guarda el valor de lo alto del objeto jugador
    private GreenfootImage img;//variable para obtener el valor de la altura de la imagen 
    
    private boolean bala;//varialbe usada para saver si disparo
    private int carga;//sirve como contador para que espere entre un disparo y otro
    /**
     * constructor del jugador se inicializan las variables 
     */
   public jugador()
   {
       carga=5;
       estaCongelado=false;
       bala=true;
       contHielo=0;
   }
   /**
    * metodo en donde se llama a los metodos necesarios para que el objeto jugador actue
    */
    public void act() 
    {
        move();
        avanzaFondo();
        dispara();
        caeAgua();
        congelado();
        tocaMaloso();
    }   
    /**
     * detecta si el jugador callo al agua
     */
    public void caeAgua()
    {
        World m= getWorld();
        if(getY()==388)
        {
          Greenfoot.playSound("splash.mp3");
          if(dir)
          this.setLocation(this.getX()-40,this.getY()-120);
          else
          this.setLocation(this.getX()+40,this.getY()-120);
          ((mundo)m).actualizaVida();
        }
        
    }
    /**
     * detecta si el jugador toco un objeto de la superclase Maloso y elimina 
     */
    public void tocaMaloso()
    {
        World m=getWorld();
        if(esMaloso())
        {    ((mundo)m).actualizaVida();
             this.setLocation(this.getX()+80,this.getY()-80);
        }
    }
    /**
     * regresa un booleano si el jugador intersepto con un maloso de tipo Oso
     */
    public boolean esOso()
    {
        boolean res=false;
        Actor obs=getOneIntersectingObject(Oso.class);
        if(obs!=null)
           //getWorld().removeObject(obs);
           res=true;
        
        return res;
    }
    /**
     * regresa un booleano si el jugador intersepto con un maloso de tipo Cubo
     */
    public boolean esHielo()
    {
        boolean res=false;
        Actor obs=getOneIntersectingObject(Cubo.class);
        if(obs!=null)
        {
           getWorld().removeObject(obs);
           res=true;
        }
        return res;
    }
    /**
     * cambia de imagen en caso de ser congelado
     */
    public void congelado()
    {
        if(esHielo())
        { 
            estaCongelado=true;
            if(dir)
              super.setImage("jugadorC.png");
            else
              super.setImage("jugador2C.png"); 
        }
    }
    /**
     * metodo que detecta si se presiono las teclas de direccion 
     */
    public void move()
    {
        World m= getWorld();
        yIni=this.getY();        
        if(Greenfoot.isKeyDown("right"))
        {
          dir=true; 
          if(!estaCongelado)
          {
             super.setImage("jugador.png");
             move(5);
             if(this.esObstaculo2()&&this.esObstaculo())  
                 {move(-5);
                 ((mundo)m).retrocede();}
             if(this.getY()==388)
               if(this.esObstaculo()||this.esObstaculo2())
                   move(-5);    
             ((mundo)m).avanza();
          }
          else
            if(contHielo<50)
              contHielo=contHielo+1;
        }
        if(Greenfoot.isKeyDown("left"))
        {
           dir=false; 
           if(!estaCongelado)
          {
             super.setImage("jugador2.png");
             move(-5);
             if(this.esObstaculo2()&&this.esObstaculo())  
             {
               move(5);
               ((mundo)m).avanza();
            }
             if(this.getY()==388)
               if(this.esObstaculo()||this.esObstaculo2())
                  move(5);
              if(this.getX()>1)((mundo)m).retrocede();
           }
           else
             if(contHielo<50)
                contHielo=contHielo+1;
        }   
        if(Greenfoot.isKeyDown("up"))
        { 
            if(!estaCongelado&&!esOso())
            {
              salto=true;
              img=this.getImage();
              alto=img.getHeight()+5;
              if(yIni<340&&yIni>220&&salto)
              {
                salto=false;
                //if(esObstaculo2()||esObstaculo())
                   this.setLocation(this.getX(),this.getY()-alto);
               }
            }
            else
              if(contHielo<50)
                 contHielo=contHielo+1;
        }
        
         if(this.esObstaculo()||this.esObstaculo2())
            this.setLocation(this.getX(),this.getY());
         else{
            this.setLocation (this.getX(),this.getY()+9);
            }
        
        if(contHielo==50)
        {
            contHielo=0;
            estaCongelado=false;
            if(dir)
              super.setImage("jugador.png");
            else
              super.setImage("jugador2.png");
        }
        
    }
    /**
     * metodo que detecta si se presiono la tecla space y agrega el objeto bala 
     */
    public void dispara()
    {
        World m= getWorld();
        
        if(((mundo)m).municiones>0)
        {  
          if(carga<5)
             carga=carga+1;  
          if(Greenfoot.isKeyDown("space"))
            if(carga==5)
            {
              carga=0;  
              Greenfoot.playSound("disparo.mp3");
              getWorld().addObject(new Bala(dir),getX(),getY()+2);  
              ((mundo)m).actualizaCont();
            }
        }
       
    }
    /**
     * regresa un booleano true en caso de interspctar un obstaculo
     */
    public boolean esObstaculo()
    {
        boolean res=false;
        Actor obs=getOneIntersectingObject(Obstaculo.class);
        if(obs!=null)
           res=true;
        return res;
    }
    /**
     * regresa un booleano true en caso de interspctar un obstaculo2
     */
    public boolean esObstaculo2()
    {
        boolean res=false;
        Actor obs=getOneIntersectingObject(Obstaculo2.class);
        if(obs!=null)
           res=true;
        return res;
    }
    /**
     * regresa un booleano true en caso de interspctar un Maloso
     */
    public boolean esMaloso()
    {
        boolean res=false;
        Actor obs=getOneIntersectingObject(Maloso.class);
        if(obs!=null)
           res=true;
        return res;
    }
    /**
     * metodo que regresa al mundo si avanzo el jugador mas alla de los limites de la pantalla y reubica aljugador al principio y cambia el fondo  
     */
    public void avanzaFondo()
    {
        World m= getWorld();
        if(this.getX()==m.getWidth()-1)
        {
            
            ((mundo)m).cambiaEscenario(t);
            this.setLocation(1,270);  
            t=t+1;
            if(t==3)
              t=0;
        }
    }
}
